package com.smart.community.property.mapper;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.property.entity.RepairOrder;
import com.smart.community.property.vo.RepairOrderVO;

/**
 * 维修工单Mapper接口
 * 
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Mapper
public interface RepairOrderMapper extends BaseMapper<RepairOrder> {
    
    /**
     * 根据ID查询维修工单（包含关联信息）
     * 
     * @param id 工单ID
     * @return 维修工单信息
     */
    RepairOrder selectRepairOrderById(@Param("id") Long id);
    
    /**
     * 根据工单号查询维修工单
     * 
     * @param orderNo 工单号
     * @return 维修工单信息
     */
    RepairOrder selectByOrderNo(@Param("orderNo") String orderNo);
    
    /**
     * 分页查询维修工单（包含关联信息）
     * 
     * @param page 分页参数
     * @param communityId 社区ID
     * @param status 状态
     * @param repairType 维修类型
     * @param urgencyLevel 紧急程度
     * @param keyword 关键词（工单号、标题、描述）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分页结果
     */
    IPage<RepairOrderVO> selectRepairOrderPage(Page<RepairOrderVO> page,
                                           @Param("communityId") Long communityId,
                                           @Param("status") Integer status,
                                           @Param("repairType") Integer repairType,
                                           @Param("urgencyLevel") Integer urgencyLevel,
                                           @Param("keyword") String keyword,
                                           @Param("startTime") LocalDateTime startTime,
                                           @Param("endTime") LocalDateTime endTime);
    
    /**
     * 根据用户ID查询维修工单列表
     * 
     * @param userId 用户ID
     * @param communityId 社区ID
     * @param status 状态
     * @return 维修工单列表
     */
    List<RepairOrder> selectByUserId(@Param("userId") Long userId,
                                    @Param("communityId") Long communityId,
                                    @Param("status") Integer status);
    
    /**
     * 根据居民ID查询维修工单列表
     * 
     * @param residentId 居民ID
     * @param communityId 社区ID
     * @param status 状态
     * @return 维修工单列表
     */
    List<RepairOrder> selectByResidentId(@Param("residentId") Long residentId,
                                        @Param("communityId") Long communityId,
                                        @Param("status") Integer status);
    
    /**
     * 根据维修人员ID查询维修工单列表
     * 
     * @param assignTo 维修人员ID
     * @param communityId 社区ID
     * @param status 状态
     * @return 维修工单列表
     */
    List<RepairOrder> selectByAssignTo(@Param("assignTo") Long assignTo,
                                      @Param("communityId") Long communityId,
                                      @Param("status") Integer status);
    
    /**
     * 更新工单状态
     * 
     * @param id 工单ID
     * @param status 新状态
     * @param updateBy 更新人
     * @return 更新结果
     */
    int updateStatus(@Param("id") Long id,
                    @Param("status") Integer status,
                    @Param("updateBy") Long updateBy);
    
    /**
     * 分配工单给维修人员
     * 
     * @param id 工单ID
     * @param assignTo 维修人员ID
     * @param assignTime 分配时间
     * @param updateBy 更新人
     * @return 更新结果
     */
    int assignOrder(@Param("id") Long id,
                   @Param("assignTo") Long assignTo,
                   @Param("assignTime") LocalDateTime assignTime,
                   @Param("updateBy") Long updateBy);
    
    /**
     * 批量分配工单
     * 
     * @param ids 工单ID列表
     * @param assignTo 维修人员ID
     * @param assignTime 分配时间
     * @param updateBy 更新人
     * @return 更新结果
     */
    int batchAssignOrders(@Param("ids") List<Long> ids,
                         @Param("assignTo") Long assignTo,
                         @Param("assignTime") LocalDateTime assignTime,
                         @Param("updateBy") Long updateBy);
    
    /**
     * 完成工单
     * 
     * @param id 工单ID
     * @param completeTime 完成时间
     * @param satisfaction 满意度评分
     * @param updateBy 更新人
     * @return 更新结果
     */
    int completeOrder(@Param("id") Long id,
                     @Param("completeTime") LocalDateTime completeTime,
                     @Param("satisfaction") Integer satisfaction,
                     @Param("updateBy") Long updateBy);
    
    /**
     * 取消工单
     * 
     * @param id 工单ID
     * @param updateBy 更新人
     * @return 更新结果
     */
    int cancelOrder(@Param("id") Long id,
                   @Param("updateBy") Long updateBy);
    
    /**
     * 更新满意度评分
     * 
     * @param id 工单ID
     * @param satisfaction 满意度评分
     * @param updateBy 更新人
     * @return 更新结果
     */
    int updateSatisfaction(@Param("id") Long id,
                          @Param("satisfaction") Integer satisfaction,
                          @Param("updateBy") Long updateBy);
    
    /**
     * 批量更新工单状态
     * 
     * @param ids 工单ID列表
     * @param status 新状态
     * @param updateBy 更新人
     * @return 更新结果
     */
    int batchUpdateStatus(@Param("ids") List<Long> ids,
                         @Param("status") Integer status,
                         @Param("updateBy") Long updateBy);
    
    /**
     * 检查工单号是否存在
     * 
     * @param orderNo 工单号
     * @param excludeId 排除的工单ID
     * @return 是否存在
     */
    boolean existsByOrderNo(@Param("orderNo") String orderNo,
                           @Param("excludeId") Long excludeId);
    
    /**
     * 生成工单号
     * 
     * @param prefix 前缀
     * @return 工单号
     */
    String generateOrderNo(@Param("prefix") String prefix);
    
    /**
     * 查询今日新增工单数量
     * 
     * @param communityId 社区ID
     * @return 今日新增工单数量
     */
    Integer selectTodayNewOrderCount(@Param("communityId") Long communityId);
    
    /**
     * 查询今日完成工单数量
     * 
     * @param communityId 社区ID
     * @return 今日完成工单数量
     */
    Integer selectTodayCompletedOrderCount(@Param("communityId") Long communityId);
    
    /**
     * 查询待处理的紧急工单
     * 
     * @param communityId 社区ID
     * @return 紧急工单列表
     */
    List<RepairOrder> selectUrgentPendingOrders(@Param("communityId") Long communityId);
    
    /**
     * 查询超时未处理的工单
     * 
     * @param communityId 社区ID
     * @param timeoutHours 超时小时数
     * @return 超时工单列表
     */
    List<RepairOrder> selectTimeoutOrders(@Param("communityId") Long communityId,
                                         @Param("timeoutHours") Integer timeoutHours);
    
    /**
     * 统计各状态工单数量
     * 
     * @param communityId 社区ID
     * @return 统计结果
     */
    List<Map<String, Object>> selectStatusStatistics(@Param("communityId") Long communityId);
    
    /**
     * 统计各维修类型工单数量
     * 
     * @param communityId 社区ID
     * @return 统计结果
     */
    List<Map<String, Object>> selectTypeStatistics(@Param("communityId") Long communityId);
    
    /**
     * 统计各紧急程度工单数量
     * 
     * @param communityId 社区ID
     * @return 统计结果
     */
    List<Map<String, Object>> selectUrgencyStatistics(@Param("communityId") Long communityId);
    
    /**
     * 查询本月工单统计
     * 
     * @param communityId 社区ID
     * @return 本月工单统计
     */
    Map<String, Object> selectMonthlyStatistics(@Param("communityId") Long communityId);
} 